XSettingsList is now a typedef for GHashTable.
authorJohn Lindgren <john.lindgren@aol.com>
Sat, 26 Jan 2013 21:47:09 +0000 (16:47 -0500)
committerBenjamin Otte <otte@redhat.com>
Sun, 27 Jan 2013 00:08:25 +0000 (01:08 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=692605

gdk/x11/xsettings-client.c
gdk/x11/xsettings-common.c
gdk/x11/xsettings-common.h

index 103843d8e2050b4505328ea60d55174f8318d360..fb3dca3284b5401823c0cc7cd8227b4a2dfeccbb 100644 (file)
@@ -56,51 +56,36 @@ static void
 notify_changes (XSettingsClient *client,
                XSettingsList   *old_list)
 {
-  XSettingsList *old_iter = old_list;
-  XSettingsList *new_iter = client->settings;
+  GHashTableIter iter;
+  XSettingsSetting *setting, *old_setting;
 
   if (!client->notify)
     return;
 
-  while (old_iter || new_iter)
+  if (client->settings != NULL)
     {
-      int cmp;
-      
-      if (old_iter && new_iter)
-       cmp = strcmp (old_iter->setting->name, new_iter->setting->name);
-      else if (old_iter)
-       cmp = -1;
-      else
-       cmp = 1;
-
-      if (cmp < 0)
-       {
-         client->notify (old_iter->setting->name,
-                         XSETTINGS_ACTION_DELETED,
-                         NULL,
-                         client->cb_data);
-       }
-      else if (cmp == 0)
+      g_hash_table_iter_init (&iter, client->settings);
+      while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &setting))
        {
-         if (!xsettings_setting_equal (old_iter->setting,
-                                       new_iter->setting))
-           client->notify (old_iter->setting->name,
-                           XSETTINGS_ACTION_CHANGED,
-                           new_iter->setting,
-                           client->cb_data);
-       }
-      else
-       {
-         client->notify (new_iter->setting->name,
-                         XSETTINGS_ACTION_NEW,
-                         new_iter->setting,
-                         client->cb_data);
+         old_setting = xsettings_list_lookup (old_list, setting->name);
+
+         if (old_setting == NULL)
+           client->notify (setting->name, XSETTINGS_ACTION_NEW, setting, client->cb_data);
+         else if (!xsettings_setting_equal (setting, old_setting))
+           client->notify (setting->name, XSETTINGS_ACTION_CHANGED, setting, client->cb_data);
+           
+         /* remove setting from old_list */
+         if (old_setting != NULL)
+           g_hash_table_remove (old_list, setting->name);
        }
+    }
 
-      if (old_iter)
-       old_iter = old_iter->next;
-      if (new_iter)
-       new_iter = new_iter->next;
+  if (old_list != NULL)
+    {
+      /* old_list now contains only deleted settings */
+      g_hash_table_iter_init (&iter, old_list);
+      while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &old_setting))
+       client->notify (old_setting->name, XSETTINGS_ACTION_DELETED, NULL, client->cb_data);
     }
 }
 
index cc3a8d03069ee498de95796f12100ec56ba6cfba..6f66a40bc5875f4a22477373c5500fc78fd05752 100644 (file)
@@ -80,45 +80,6 @@ xsettings_setting_copy (XSettingsSetting *setting)
   return NULL;
 }
 
-XSettingsList *
-xsettings_list_copy (XSettingsList *list)
-{
-  XSettingsList *new = NULL;
-  XSettingsList *old_iter = list;
-  XSettingsList *new_iter = NULL;
-
-  while (old_iter)
-    {
-      XSettingsList *new_node;
-
-      new_node = malloc (sizeof *new_node);
-      if (!new_node)
-       goto error;
-
-      new_node->setting = xsettings_setting_copy (old_iter->setting);
-      if (!new_node->setting)
-       {
-         free (new_node);
-         goto error;
-       }
-
-      if (new_iter)
-       new_iter->next = new_node;
-      else
-       new = new_node;
-
-      new_iter = new_node;
-      
-      old_iter = old_iter->next;
-    }
-
-  return new;
-
- error:
-  xsettings_list_free (new);
-  return NULL;
-}
-
 int
 xsettings_setting_equal (XSettingsSetting *setting_a,
                         XSettingsSetting *setting_b)
@@ -160,103 +121,33 @@ xsettings_setting_free (XSettingsSetting *setting)
 void
 xsettings_list_free (XSettingsList *list)
 {
-  while (list)
-    {
-      XSettingsList *next = list->next;
-
-      xsettings_setting_free (list->setting);
-      free (list);
-
-      list = next;
-    }
+  if (list != NULL)
+    g_hash_table_destroy (list);
 }
 
 XSettingsResult
 xsettings_list_insert (XSettingsList    **list,
                       XSettingsSetting  *setting)
 {
-  XSettingsList *node;
-  XSettingsList *iter;
-  XSettingsList *last = NULL;
-
-  node = malloc (sizeof *node);
-  if (!node)
-    return XSETTINGS_NO_MEM;
-  node->setting = setting;
+  if (*list == NULL)
+    *list = g_hash_table_new_full (g_str_hash, g_str_equal, NULL,
+                                   (GDestroyNotify) xsettings_setting_free);
 
-  iter = *list;
-  while (iter)
-    {
-      int cmp = strcmp (setting->name, iter->setting->name);
+  if (g_hash_table_lookup (*list, setting->name) != NULL)
+    return XSETTINGS_DUPLICATE_ENTRY;
 
-      if (cmp < 0)
-       break;
-      else if (cmp == 0)
-       {
-         free (node);
-         return XSETTINGS_DUPLICATE_ENTRY;
-       }
-
-      last = iter;
-      iter = iter->next;
-    }
-  
-  if (last)
-    last->next = node;
-  else
-    *list = node;
-  
-  node->next = iter;
-  
+  g_hash_table_insert (*list, setting->name, setting);
   return XSETTINGS_SUCCESS;
 }
 
-XSettingsResult
-xsettings_list_delete (XSettingsList **list,
-                      const char     *name)
-{
-  XSettingsList *iter;
-  XSettingsList *last = NULL;
-
-  iter = *list;
-  while (iter)
-    {
-      if (strcmp (name, iter->setting->name) == 0)
-       {
-         if (last)
-           last->next = iter->next;
-         else
-           *list = iter->next;
-  
-         xsettings_setting_free (iter->setting);
-         free (iter);
-
-         return XSETTINGS_SUCCESS;
-       }
-
-      last = iter;
-      iter = iter->next;
-    }
-
-  return XSETTINGS_FAILED;
-}
-
 XSettingsSetting *
 xsettings_list_lookup (XSettingsList *list,
                       const char    *name)
 {
-  XSettingsList *iter;
-
-  iter = list;
-  while (iter)
-    {
-      if (strcmp (name, iter->setting->name) == 0)
-       return iter->setting;
-
-      iter = iter->next;
-    }
-
-  return NULL;
+  if (list == NULL)
+    return NULL;
+    
+  return g_hash_table_lookup (list, name);
 }
 
 char
index dcd87f4fa438da305cdb8b4d9ae5001c6dfc77cb..0577db5d1e418c15a6afa91ff55eb332059f41ca 100644 (file)
@@ -23,7 +23,8 @@
 #ifndef XSETTINGS_COMMON_H
 #define XSETTINGS_COMMON_H
 
-#include <unistd.h>
+#include <glib.h>
+#include <sys/types.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -39,8 +40,6 @@ extern "C" {
 #define xsettings_client_set_grab_func   _gdk_x11_xsettings_client_set_grab_func
 #define xsettings_client_set_ungrab_func _gdk_x11_xsettings_client_set_ungrab_func
 #define xsettings_client_process_event   _gdk_x11_xsettings_client_process_event
-#define xsettings_list_copy              _gdk_x11_xsettings_list_copy
-#define xsettings_list_delete            _gdk_x11_xsettings_list_delete
 #define xsettings_list_free              _gdk_x11_xsettings_list_free
 #define xsettings_list_insert            _gdk_x11_xsettings_list_insert
 #define xsettings_list_lookup            _gdk_x11_xsettings_list_lookup
@@ -48,10 +47,10 @@ extern "C" {
 #define xsettings_setting_equal          _gdk_x11_xsettings_setting_equal
 #define xsettings_setting_free           _gdk_x11_xsettings_setting_free
 
+typedef GHashTable XSettingsList;
 
 typedef struct _XSettingsBuffer  XSettingsBuffer;
 typedef struct _XSettingsColor   XSettingsColor;
-typedef struct _XSettingsList    XSettingsList;
 typedef struct _XSettingsSetting XSettingsSetting;
 
 /* Types of settings possible. Enum values correspond to
@@ -87,12 +86,6 @@ struct _XSettingsColor
   unsigned short red, green, blue, alpha;
 };
 
-struct _XSettingsList
-{
-  XSettingsSetting *setting;
-  XSettingsList *next;
-};
-
 struct _XSettingsSetting
 {
   char *name;
@@ -113,13 +106,10 @@ int               xsettings_setting_equal (XSettingsSetting *setting_a,
                                           XSettingsSetting *setting_b);
 
 void              xsettings_list_free   (XSettingsList     *list);
-XSettingsList    *xsettings_list_copy   (XSettingsList     *list);
 XSettingsResult   xsettings_list_insert (XSettingsList    **list,
                                         XSettingsSetting  *setting);
 XSettingsSetting *xsettings_list_lookup (XSettingsList     *list,
                                         const char        *name);
-XSettingsResult   xsettings_list_delete (XSettingsList    **list,
-                                        const char        *name);
 
 char xsettings_byte_order (void);